home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / CycleItem.C < prev    next >
C/C++ Source or Header  |  1990-12-04  |  2KB  |  135 lines

  1. //$CycleItem$
  2.  
  3. #include "CycleItem.h"
  4.  
  5. //---- CycleItem ---------------------------------------------------------------
  6.  
  7. MetaImpl(CycleItem, (T(current), TE(align), TB(mode), 0));
  8.  
  9. CycleItem::CycleItem(int id, VObjAlign a, Collection *cp)
  10.                     : CompositeVObject(id, cp)
  11. {
  12.     Init(a);
  13. }
  14.  
  15. CycleItem::CycleItem(int id, VObjAlign va_(a), ...)
  16.                     : CompositeVObject(id, (Collection*)0)
  17. {
  18.     va_list ap;
  19.     va_start(ap, va_(a));
  20.     SetItems(ap);
  21.     Init(va_(a));
  22.     va_end(ap);
  23. }
  24.  
  25. CycleItem::CycleItem(int id, VObjAlign a, va_list ap)
  26.                     : CompositeVObject(id, ap)
  27. {
  28.     Init(a);
  29. }
  30.  
  31. void CycleItem::Init(VObjAlign a)
  32. {
  33.     current= 0;
  34.     align= a;
  35.     mode= FALSE;
  36. }
  37.  
  38. Metric CycleItem::GetMinSize()
  39. {
  40.     Metric m;
  41.  
  42.     if (mode)
  43.     m= At(current)->GetMinSize();
  44.     else {
  45.     Iter next(list);
  46.     VObject *dip;
  47.     int w= 0, b1= 0, b= 0;
  48.  
  49.     while (dip= (VObject*) next()) {
  50.         m= dip->GetMinSize();
  51.         w= max(w, m.extent.x);
  52.         b= max(b, m.base);
  53.         b1= max(b1, m.extent.y-m.base);
  54.     }
  55.     m.extent.x= w;
  56.     m.extent.y= b+b1;
  57.     m.base= b;
  58.     }
  59.     return m;
  60. }
  61.  
  62. void CycleItem::SetOrigin(Point at)
  63. {
  64.     VObject::SetOrigin(at);
  65.     if (mode)
  66.     At(current)->SetOrigin(at);
  67.     else {
  68.     Metric m(contentRect.extent);
  69.     list->ForEach(VObject,Align)(at, m, align);
  70.     }
  71. }
  72.  
  73. void CycleItem::SetExtent(Point e)
  74. {
  75.     VObject::SetExtent(e);
  76.     if (mode)
  77.     At(current)->SetExtent(e);
  78.     else {
  79.     list->ForEach(VObject,SetExtent)(e);
  80.     }
  81. }
  82.  
  83. void CycleItem::Draw(Rectangle r)
  84. {
  85.     At(current)->DrawAll(r, FALSE);
  86. }
  87.  
  88. Command *CycleItem::DispatchEvents(Point lp, Token t, Clipper *vf)
  89. {
  90.     return At(current)->DispatchEvents(lp, t, vf);
  91. }
  92.  
  93. void CycleItem::SetCurrentItem(int at)
  94. {
  95.     if (at != current) {
  96.     if (current)
  97.         Control(cIdNone, cPartFocusRemove, At(current)); 
  98.     current= at;
  99.     if (mode)
  100.         Control(GetId(), cPartLayoutChanged, 0);
  101.     else
  102.         ForceRedraw();
  103.     }
  104. }
  105.  
  106. void CycleItem::SendDown(int, int part, void*)
  107. {
  108.     int next= current;
  109.     
  110.     switch (part) {
  111.     case cPartIncr:
  112.     if (++next >= Size())
  113.         next= 0;
  114.     break;
  115.     case cPartDecr:
  116.     if (--next < 0)
  117.         next= Size()-1;
  118.     break;
  119.     }
  120.     SetCurrentItem(next);
  121. }
  122.  
  123. ostream& CycleItem::PrintOn(ostream &s)
  124. {
  125.     CompositeVObject::PrintOn(s);
  126.     return s << current SP << align SP << mode SP;
  127. }
  128.  
  129. istream& CycleItem::ReadFrom(istream &s)
  130. {
  131.     CompositeVObject::ReadFrom(s);
  132.     return s >> current >> Enum(align) >> Bool(mode);
  133. }
  134.  
  135.